//封装axios
//练习git分支合并
import axios from "axios";
import store from "@/store/index.js";
// console.dir(store);
import jsonBig from "json-bigint";

import router from "@/router/index.js";

//创建实例
const ajax = axios.create({
  baseURL: "http://ttapi.research.itcast.cn",
  headers: {
    "Content-Type": "application/json"
  },
  transformResponse: [
    function(data) {
      //容错
      try {
        console.log("jsonBig数据处理大数");
        return jsonBig.parse(data);
      } catch (error) {
        console.log("服务器返回来的数据无法处理");
        return data;
      }
    }
  ]
  // timeout: 1000,
});
// 添加请求拦截器
ajax.interceptors.request.use(
  function(config) {
    // 在发送请求之前做些什么
    // 这里的config就是当前请求的配置
    const token = store.state.tokenInfo.token;
    if (token) {
      // 从vuex中取出token，添加在headers中
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  function(error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器
//解决token过期失效的问题
ajax.interceptors.response.use(
  res => {
    return res;
  },
  async err => {
    if (err.response && err.response.status === 401) {
      //1.判断错误码，是不是401
      //是401
      //1.获取参数 refresh_token
      const rtoken = store.state.tokenInfo.refresh_token;
      /*
                  有refresh_token，用refresh_token去请求回新的token
                  - 新token请求成功 
                      - 更新本地token 
                      - 再发一次请求A   
                  - 新token请求失败
                      - 携带请求地址，跳转到登陆页
                  没有refresh_token
                    携带请求地址，跳转到登陆页
                  */
      if (rtoken) {
        try {
          //2.接口封装
          //3.接口调用 用axios 原因是不用单独处理 封装好的那个headers里面的问题
          const res = await axios({
            url: "http://ttapi.research.itcast.cn/app/v1_0/authorizations",
            method: "PUT",
            headers: {
              Authorization: `Bearer ${rtoken}`
            }
          });
          console.log(res, "过期");
          //4.获取接口返回的新token
          //5.更新我们的token 更新旧的token
          store.commit("onlyToken", res.data.data.token);
          //6.成功之后我们就可以重新去响应
          // console.log(err.config); //err.config是一个对象 里面有配置信息
          return ajax(err.config); //重新发起请求，调用接口
        } catch {
          //7.更新失败了，返回登录页
          console.log("失败");
          console.log(router); //全局路由
          router.push("/login?backto=" + router.currentRoute.fullPath);
        }
      } else {
        router.push("/login?backto=" + router.currentRoute.fullPath);
      }
    } else {
      //2.不是401 return
      return Promise.reject(err);
    }
  }
);

//默认导出
export default ajax;

//按需导出，一般导出
// export { ajax };
